import 'package:flutter/material.dart';
import 'package:test1/View/MyRowText.dart';
// typedef 定义函数类型的别名
typedef Sum = int Function(int a, int b);

class Dart_Function_Page extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //普通函数
    int add(int a, int b) {
      return a + b;
    }

    //可选参数
    int add1(int a, int b, [int c]) {
      if (c != null) {
        return a + b + c;
      }
      return a + b;
    }

    //可选参数设置默认值
    int add2(int a, int b, [int c = 100]) {
      return a + b + c;
    }

    //具名参数,具有可选参数的特性
    int sub({int a, int b}) {
      return a - b;
    }

    //具名参数设置默认值
    int sub1({int a, int b = 0}) {
      return a - b;
    }

//    具名参数,可以设置某个参数是必须的@required
    int add3({int a, @required int b, int c}) {
      if (a == null && c == null) {
        return b;
      } else if (a == null && c != null) {
        return b + c;
      } else if (a != null && c == null) {
        return a + b;
      } else if (a != null && c != null) {
        return a + b + c;
      }
    }

    //dosum函数，会先执行return add, 然后调用add方法
    Sum dosum(int c) {
      int add(int a, int b) {
        return a + b + c; //这个return是add的返回
      }
      return add; //这个return是dosum的返回
    }

//    int Function(int a, int b) dosum(int c) {
//      int add(int a, int b) {
//        return a + b + c; //这个return是add的返回
//      }
//      return add; //这个return是dosum的返回
//    }

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("函数"),
        ),
        body: ListView(
          children: <Widget>[
            MyRowText("普通函数，和Java相同", () =>
                print(add(1, 2))
            ),
            MyRowText("可选参数", () =>
                print(add1(1, 2))
            ),
            MyRowText("可选参数", () =>
                print(add1(1, 2, 3))
            ),
            MyRowText("可选参数设置默认值", () =>
                print(add2(1, 2))
            ),
            MyRowText("具名参数,具有可选参数的特性", () =>
                print(sub(a: 1, b: 2))
            ),
            MyRowText("具名参数,具有可选参数的特性", () =>
                print(sub(b: 2, a: 1))
            ),
            MyRowText("具名参数设置默认值", () =>
                print(sub1(a: 1))
            ),
            MyRowText("具名参数,可以设置某个参数是必须的@required", () =>
                print(add3(b: 1))
            ),
            MyRowText("在函数内部定义函数", () {
              var add = dosum(1);
              print(add(2, 3));
//                print(dosum(1)(2, 3))
            }
            ),
          ],
        ),
      ),
    );
  }
}